package com.desiy.controller;

import com.desiy.entity.Admin;
import com.desiy.service.AdminService;
import com.desiy.utils.MsgData;
import com.desiy.utils.RSA;
import com.desiy.utils.RSAUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.util.List;

/**
 * @author Desiy
 * @date 2020/9/16 21:34
 */
@RestController
@CrossOrigin
public class LoginController {

    // LoggerFactory 取代System.out.println()
    private static Logger logger = LoggerFactory.getLogger(LoginController.class);

    RSA rsa = new RSA();

    @Autowired
    AdminService adminService;

    @RequestMapping("/getKey")
    public String putKey(){
        return rsa.publicKey;
    }

    @RequestMapping("/login")
    public MsgData login(@RequestBody Admin admin) throws InvalidKeySpecException, NoSuchAlgorithmException {
        MsgData msgData = new MsgData<>();
        // 后端获取私钥
        String privateKey = rsa.privateKey;
        // 转换为RSA类型的私钥
        RSAPrivateKey rsaPrivateKey = RSAUtils.getPrivateKey(privateKey);
        // 从前端获取用户输入的用户名、验证码以及密文
        String username = admin.getUsername();
        String code = admin.getCode();
        String new_Pwd = admin.getPassword();
//        logger.info("从前端获取的用户名：{} | 密文：{} | 明文：{}",username, new_Pwd, code);
        // 从数据库中通过用户名获取密文 - DsPassword
        String DsPassword = adminService.selectPassword(username);
        if (DsPassword == null){
            // 199 - 数据库中没有此用户的密文，也就表明不是我们内定的用户，需要重新注册。
            msgData.setCode(199);
            return msgData;
        }else {
            // 使用私钥解密DsPassword
            String DsPlaintext = RSAUtils.privateDecrypt(DsPassword, rsaPrivateKey);
            // 使用私钥解密经过前端加密用户输入的密文
            String Decrypt_web = RSAUtils.privateDecrypt(new_Pwd, rsaPrivateKey);
            if (DsPlaintext.equals(Decrypt_web)) {
                // 200 - 登录成功
                msgData.setCode(200);
                return msgData;
            } else {
                // 201 - 登录失败
                msgData.setCode(201);
                return msgData;
            }
        }
    }

    @RequestMapping("/register")
    public MsgData register(@RequestBody Admin admin){
        MsgData msgData = new MsgData<>();
        String rel_name = admin.getRel_name();
        String username = admin.getUsername();
        String new_Pwd = admin.getPassword();
        logger.info("从前端获取的真实姓名：{} | 用户名：{} | 密文：{}",rel_name, username, new_Pwd);
        // 注册：真实姓名和密码可以重复，但是用户名不行。
        String select_Username = adminService.selectUsername(username);
        // null：表示未能从数据库中找到与username值一样的数据
        if (select_Username == null) {
            adminService.add(rel_name, username, new_Pwd);
            msgData.setCode(200);
        } else {
            msgData.setCode(201);
        }
        return msgData;
    }


}
